//
//  UserAccountViewModel.swift
//  WeiBlog
//
//  Created by apple on 15/10/17.
//  Copyright © 2015年 xiang. All rights reserved.
//

import Foundation
/**
    视图模型:就是将控制器和视图和模型分开
    
让控制器的代码更加清晰,精简

视图模型可以处理网络请求

不再直接和模型进行交互

视图/控制器 ----- 视图模型 ------- 模型

'视图模型'里面通常有一个'模型'
'模型'是存储数据的,'视图模型'是处理数据的,就是各种计算
控制器(视图)通常有一个'视图模型'属性,就是来获取各种处理好的数据的
*/



/**
    定义一个不继承任何类的类

    此处定义的这个类就处理用户基本信息获取这一块的业务逻辑

    根据新浪API提供的接口,我们需要token值
*/
class UserAccountViewModel {
    
    // MARK: - 单例
    static let sharedUserAccountViewModel = UserAccountViewModel()
    
    ///用户信息模型
    var userAccountInfo:UserAccountInfo?
    
    /// 用户头像 URL
    var avatarUrl: NSURL {
        return NSURL(string: userAccountInfo?.avatar_large ?? "")!
    }
    
    //首先是token有值带便用户授权了,也就是登录了,其次还要判断token是否过期
    /// 是否登录
    var isLogin:Bool{
        
        return !isExpired && userAccountInfo?.access_token != nil
    }
    
     /// 是否过期
    var isExpired:Bool{
        ////升序表示过期(截止日期<当前日期)
        return userAccountInfo?.expires_date?.compare(NSDate()) == NSComparisonResult.OrderedAscending
    }
    
    ///  用户信息存档路径
    var filePath:String?{
        
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]

        let filePath = (path as NSString).stringByAppendingPathComponent("userAccount.plist")
        
        return filePath
    }
    ///  token
    var token:String?{
        
        if isExpired {
            return nil
        }
        return userAccountInfo?.access_token
    }
    
    ///  构造函数
    init(){
        
        userAccountInfo = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath!) as? UserAccountInfo
        
        //过期就清空userAccountInfo
        //安全,需要重新登录
        if isExpired {
            
            userAccountInfo = nil
        }
    }
    
}

// MARK: - 登录账户信息部分网络请求
extension UserAccountViewModel
{
    
//    func askForStatus(token:String,finished:NetworkCallBack)
    
    ///  请求用户信息(点授权或取消时调用的方法)
    ///
    ///  - parameter code:     从URL中获取的code值,code值是用来获取token的
    ///  - parameter finished: 回调
    func askForUserInfo(code:String,finished:(isSuccessed:Bool)->()){
        NetworkManager.sharedManager.askForOAuthtoken(code, finished: { (resultData, error) -> () in
            
            if error != nil{
                print("请求token失败")
                finished(isSuccessed: false)
                print(error)
                return
            }
            print("请求token成功")
            //                    print(resultData)
            //将数据转成字典
            let userInfodict = resultData as! [String:AnyObject]
            //接收数据
            self.userAccountInfo = UserAccountInfo(dict: userInfodict)
            //请求用户信息
            self.askForUserInfo(uid:(self.userAccountInfo?.uid)!, finished: finished)
        })
    }
    //    这就是通过askForOAuthtoken拿到的数据,我们可以用这个数据,关键是token值,然后用新浪提供的借口,去访问他的数据,用户资料管的微博,首页内容等等(不包括隐私资料)
    //    Optional({
    //    "access_token" = "2.00z3C_bF0h2O9h58398481c4IiqZwC";
    //    "expires_in" = 157679999;
    //    "remind_in" = 157679999;
    //    uid = 5131925937;
    //    })
    
    ///  请求用户信息
    ///
    ///  - parameter token:    token值
    ///  - parameter finished: 回调,成功true,失败false
    private func askForUserInfo(uid uid: String,finished:(isSuccessed:Bool) -> ()){
        
        NetworkManager.sharedManager.askForUserInfo(uid) { (resultData, error) -> () in
            
            //
            if error != nil{
                print("请求用户信息失败")
                print(error)
                finished(isSuccessed: false)
                return
            }
            print("请求用户信息成功.正在登录..")
            //            print(resultData)
            let resultDict = resultData as! [String:AnyObject]
            
            self.userAccountInfo?.profile_image_url = resultDict["profile_image_url"] as? String
            self.userAccountInfo?.avatar_large = resultDict["avatar_large"] as? String
            self.userAccountInfo?.screen_name = resultDict["screen_name"] as? String
            //存档
            NSKeyedArchiver.archiveRootObject(self.userAccountInfo!, toFile: self.filePath!)
            finished(isSuccessed: true)
            
        }
    }
}

